/**
 * API工具类 - 全局配置fetch请求，确保cookie和session正常传递
 */

import router from '../router';
import { ElMessage } from 'element-plus';

// API基础URL - 使用相对路径通过vite代理访问
const BASE_URL = '/api';

/**
 * 全局fetch请求配置
 * @param url API路径
 * @param options fetch选项
 * @returns Promise<any>
 */
export async function apiRequest(url: string, options: RequestInit = {}): Promise<any> {
  // 合并默认选项和用户选项
  const config: RequestInit = {
    ...options,
    // 确保携带凭证（cookies、session等）
    credentials: 'include',
    // 针对跨域请求，确保允许凭证
    mode: 'cors',
    cache: 'no-cache',
    // 设置默认头部
    headers: {
      'Content-Type': 'application/json',
      ...options.headers
    }
  };
  
  try {
    // 发送请求
    const response = await fetch(`${BASE_URL}${url}`, config);
    
    // 解析响应
    const data = await response.json();
    
    // 全局错误码处理 - 严格按照后端返回格式处理
    if (data.code === 401) {
      // 401 未登录：清除本地存储并跳转到登录页
      localStorage.removeItem('userInfo');
      ElMessage.error('登录已过期，请重新登录');
      router.replace('/login');
      throw new Error('未登录');
    } else if (data.code === 402) {
      // 402 无权限：清除本地存储并跳转到登录页
      localStorage.removeItem('userInfo');
      ElMessage.error('权限不足，请重新登录');
      router.replace('/login');
      throw new Error('权限不足');
    }
    
    return data;
  } catch (error) {
    console.error('API请求失败:', error);
    throw error;
  }
}

/**
 * POST请求 - FormData格式
 * @param url API路径
 * @param params 查询参数
 * @returns Promise<any>
 */
export async function postForm(url: string, params: Record<string, any>): Promise<any> {
  const formData = new URLSearchParams();
  
  // 添加参数
  Object.entries(params).forEach(([key, value]) => {
    if (value !== undefined && value !== null) {
      formData.append(key, value.toString());
    }
  });
  
  return apiRequest(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    body: formData
  });
}

/**
 * POST请求 - JSON格式
 * @param url API路径
 * @param data 请求数据
 * @returns Promise<any>
 */
export async function postJson(url: string, data: any): Promise<any> {
  return apiRequest(url, {
    method: 'POST',
    body: JSON.stringify(data)
  });
}

/**
 * GET请求
 * @param url API路径
 * @param params 查询参数
 * @returns Promise<any>
 */
export async function get(url: string, params?: Record<string, any>): Promise<any> {
  let fullUrl = url;
  
  // 构建查询字符串
  if (params && Object.keys(params).length > 0) {
    const queryString = new URLSearchParams(params).toString();
    fullUrl += `?${queryString}`;
  }
  
  return apiRequest(fullUrl, {
    method: 'GET'
  });
}

/**
 * POST请求 - 默认使用JSON格式
 * @param url API路径
 * @param data 请求数据
 * @returns Promise<any>
 */
export async function post(url: string, data: any): Promise<any> {
  return postJson(url, data);
}

export default {
  request: apiRequest,
  get,
  post,
  postForm,
  postJson
};